package com.dingding.common.core.base.daox.impl;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Order;
import org.springframework.stereotype.Component;

import com.dingding.common.core.base.daox.IBaseDaoX;
import com.dingding.common.core.base.daox.ICriteriaBaseDao;

/**
 * 
 * @ClassName: ICriteriaBaseDao 
 * @Description: Criteria查询
 * @author CHEHAUNBO 
 * @date 2016年8月21日 下午2:03:23
 * @since V2.4.0
 * @version V1.0
 * 
 */
@Component("criteriaBaseDao")
public class CriteriaBaseDaoImpl extends BaseDaoXImpl implements ICriteriaBaseDao, IBaseDaoX {

	/**
	 * 
	 * @Title: queryCriteriaListUnique 
	 * @Description: 根据条件查询单条数据
	 * @param criterion 查询条件 
	 * @return List<T> 查询到的数据集合 
	 * @author CHEHUANBO 
	 * 
	 */
	@Override
	public <T> T queryCriteriaListUnique(Class<T> clazz, Criterion criterion) {

		List<T> clazzs = this.queryCriteriaList(clazz, criterion, null, -1, -1);

		if (clazzs != null && clazzs.size() > 0) {
			return clazzs.get(0);
		}

		return null;

	}

	/**
	 * 
	 * @Title: queryCriteriaList 
	 * @Description: 根据条件查询数据
	 * @param criterion 查询条件 
	 * @return List<T> 查询到的数据集合 
	 * @author CHEHUANBO 
	 * 
	 */
	@Override
	public <T> List<T> queryCriteriaList(Class<T> clazz, Criterion criterion) {
		return this.queryCriteriaList(clazz, criterion, null, -1, -1);
	}

	/**
	 * 
	 * 
	 * 查询全部数据
	 * @Title: queryCriteriaList 
	 * @param criterion 查询条件 
	 * @return List<T> 查询到的数据集合 
	 * @author CHEHUANBO 
	 * 
	 */
	@Override
	public <T> List<T> queryCriteriaList(Class<T> clazz) {
		return this.queryCriteriaList(clazz, null, null, -1, -1);
	}

	/**
	 * 
	 * @Title: queryCriteriaList 
	 * @Description: 根据条件查询数据
	 * @param criterion 查询条件 
	 * @return List<T> 查询到的数据集合 
	 * @author CHEHUANBO 
	 * 
	 */
	@Override
	public <T> List<T> queryCriteriaList(Class<T> clazz, Criterion criterion, Order order) {

		List<Order> orders = new ArrayList<Order>();
		orders.add(order);

		return this.queryCriteriaList(clazz, criterion, orders, -1, -1);
	}

	/**
	 * 
	 * @Title: queryCriteriaList 
	 * @Description: 根据条件查询数据
	 * @param criterion 查询条件 
	 * @return List<T> 查询到的数据集合 
	 * @author CHEHUANBO 
	 * 
	 */
	@Override
	public <T> List<T> queryCriteriaList(Class<T> clazz, Criterion criterion, List<Order> orders) {
		return this.queryCriteriaList(clazz, criterion, orders, -1, -1);
	}

	/**
	 * 
	 * 根据条件查询数据
	 * @Title: queryCriteriaList 
	 * @param Class<T> 查询的类
	 * @param criterion 查询条件
	 * @param List<Order> 排序集合
	 * @param page 当前页
	 * @param pageSize 每页显示记录数
	 * @return List<T> 查询到的数据集合 
	 * @author CHEHUANBO 
	 * 
	 */
	@Override
	@SuppressWarnings("unchecked")
	public <T> List<T> queryCriteriaList(Class<T> clazz, Criterion criterion, List<Order> orders, int page,
			int pageSize) {

		Criteria criteria = super.getSession().createCriteria(clazz);

		// 排序
		if (orders != null && orders.size() > 0) {
			for (Order order : orders) {
				criteria.addOrder(order);
			}
		}

		// 分页
		if (page != -1 && pageSize != -1) {
			criteria.setFirstResult((page - 1) * pageSize);
			criteria.setMaxResults(pageSize);
		}

		List<T> list = null;
		try {
			if (criterion != null) {
				list = criteria.add(criterion).list();
			}
			criteria.list();
		} catch (HibernateException e) {
			log.error("根据条件查询数据出现异常！", e);
		}

		return list;
	}

}
